package com.tian.controller.center;

import com.tian.controller.BaseController;
import com.tian.pojo.Users;
import com.tian.pojo.bo.center.CenterUserBO;
import com.tian.pojo.vo.UsersVO;
import com.tian.resource.FileUpload;
import com.tian.service.center.CenterUserService;
import com.tian.utils.CookieUtils;
import com.tian.utils.DateUtil;
import com.tian.utils.JSONResult;
import com.tian.utils.JsonUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Api(value = "用户信息接口",tags = {"用户信息相关接口"})
@RestController
@RequestMapping("userInfo")
public class CenterUserController extends BaseController {

    @Autowired
    private CenterUserService centerUserService;

    @Autowired
    private FileUpload fileUpload;

    @ApiOperation(value = "用户头像修改",notes = "用户头像修改",httpMethod = "POST")
    @PostMapping("uploadFace")
    public JSONResult uploadFace(
            @ApiParam(name = "userId",value = "用户id",required = true)
            @RequestParam String userId,
            @ApiParam(name = "file",value = "用户头像",required = true)
            MultipartFile file,
            HttpServletRequest request,
            HttpServletResponse response
    ){
        //定义头像保存的地址
   //     String fileSpace=IMAGE_USER_FACE_LOCATION;
        String fileSpace = fileUpload.getImageUserFaceLocation();
        //在路径上为每一个用户增加一个userId，用于区分不同用户上传
        String uploadPathPrefix= File.separator+userId;

        //开始文件上传
        if (file !=null){
            FileOutputStream fileOutputStream=null;
            try {
                //获得文件上传的文件名称
                String filename = file.getOriginalFilename();

                if (StringUtils.isNotBlank(filename)){
                    //文件重命名 tian-face.png - > ["tian-face","png"]
                    String[] fileNameArr = filename.split("\\.");
                    //获取文件的后缀名
                    String suffix = fileNameArr[fileNameArr.length - 1];

                    if (!suffix.equalsIgnoreCase("png")&&
                            !suffix.equalsIgnoreCase("jpg")&&
                            !suffix.equalsIgnoreCase("jpeg")){
                        return JSONResult.errorMsg("图片格式不正确");
                    }

                    //文件名称重组 face-{userId}.png
                    //注：现在用的是覆盖上传，如果用增量上传，额外拼接当前时间
                    String newFileName="face-"+userId+"."+suffix;

                    //上传的头像最终保存的位置
                    String finalFacePath=fileSpace+uploadPathPrefix+File.separator+newFileName;

                    //用于提供给web服务访问的地址
                    uploadPathPrefix +=("/"+newFileName);

                    File outFile=new File(finalFacePath);
                    if (outFile.getParentFile() != null){
                        //创建文件夹
                        outFile.getParentFile().mkdirs();
                    }

                    // 文件输出保存到目录
                    fileOutputStream=new FileOutputStream(outFile);
                    InputStream inputStream = file.getInputStream();
                    IOUtils.copy(inputStream,fileOutputStream);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fileOutputStream != null){
                    try {
                        fileOutputStream.flush();
                        fileOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        }else {
            return JSONResult.errorMsg("文件不能为空");
        }

        //获取图片服务地址
        String imageServerUrl =fileUpload.getImageServerUrl();
        //由于浏览器可能存在缓存的情况，所以在这里，需要加上时间戳来保证更新后的图片可以及时刷新
        String finalUserFaceUrl=imageServerUrl+uploadPathPrefix
                +"?t="+ DateUtil.getCurrentDateString(DateUtil.DATE_PATTERN);

        //更新用户头像到数据库
        Users userResult = centerUserService.updateUserFace(userId, finalUserFaceUrl);

  //      userResult = setNullProperties(userResult);

        //增加令牌token，会整合redis，分布式会话
        UsersVO usersVO = conventUsersVO(userResult);

        CookieUtils.setCookie(request,response,"user", JsonUtils.objectToJson(usersVO),true);



        return JSONResult.ok();
    }

    @ApiOperation(value = "修改用户信息",notes = "修改用户信息",httpMethod = "POST")
    @PostMapping("update")
    public JSONResult update(
            @ApiParam(name = "userId",value = "用户id",required = true)
            @RequestParam String userId,
            @RequestBody @Valid CenterUserBO centerUserBO,
            BindingResult result,
            HttpServletRequest request,
            HttpServletResponse response
            ){
        // @Valid BindingResult 用于hibernate验证用户信息
        //判断BindingResult是否保存错误的验证信息，如果有，则直接return
        if (result.hasErrors()){
            Map<String, String> errorMap = getErrors(result);
            return JSONResult.errorMap(errorMap);
        }

        Users userResult = centerUserService.updateUserInfo(userId, centerUserBO);
  //      userResult = setNullProperties(userResult);

        //增加令牌token，会整合redis，分布式会话
        UsersVO usersVO = conventUsersVO(userResult);

        CookieUtils.setCookie(request,response,"user", JsonUtils.objectToJson(usersVO),true);



        return JSONResult.ok();
    }

    private Map<String,String> getErrors(BindingResult bindingResult){
        Map<String,String> map=new HashMap<>();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();

        for (FieldError fieldError:fieldErrors){
            //发生验证错误所对应的某一个属性
            String field = fieldError.getField();
            //验证错误的信息
            String errorDefaultMessage = fieldError.getDefaultMessage();
            map.put(field,errorDefaultMessage);
        }
        return map;
    }

    private Users setNullProperties(Users user){
        user.setPassword(null);
        user.setMobile(null);
        user.setEmail(null);
        user.setUpdatedTime(null);
        user.setCreatedTime(null);
        user.setBirthday(null);
        return user;
    }
}
